import java.util.Arrays;

/*
 * @author zzr
 * @date: 2025/10/11  11:18
 * @description: 自己模拟实现线性表
 */
public class MyArrayList {
    private int[] elem;
    private int usedSize;

    private static final int DEFAULT_SIZE = 2;

    public MyArrayList() {
        elem = new int[DEFAULT_SIZE];
    }

    /**
     * 指定初始化长度
     *
     * @param initCapacity
     */
    public MyArrayList(int initCapacity) {
        elem = new int[initCapacity];
    }

    public void display() {
        for (int i = 0; i < usedSize; i++) {
            System.out.println(elem[i] + " ");
        }
        System.out.println();
    }

    /**
     * 判断表是否为空
     *
     * @return
     */
    private boolean isFull() {
        if (usedSize > elem.length) {
            return true;
        }
        return false;
    }

    /**
     * 判断输入的位置是否合法
     * @param pos
     * @return
     */
    private boolean checkPos(int pos) {
        if (pos < 0 || pos > usedSize) {
            System.out.println("位置不合法");
            return false;
        }
        return true;
    }

    /**
     * 添加元素 默认表末尾
     *
     * @param data
     * @return
     */
    public int add(int data) {

        if (isFull()) {
            elem = Arrays.copyOf(elem, elem.length * 2);
        }
        elem[usedSize] = data;
        return usedSize++;
    }

    /**
     * 在表的指定下标 pos 中添加数据 data
     * @param pos
     * @param data
     * @return
     */
    public void add(int pos, int data) {

        if (pos < 0 || pos > usedSize) {
            System.out.println("输入位置不合法");
            return;
        }
        if (isFull()) {
            elem = Arrays.copyOf(elem, elem.length * 2);
        }
        // 需要向后移动元素
        for (int i = usedSize - 1; i >= pos; i++) {
            elem[i + 1] = elem[i];
        }
        // 填入元素
        elem[pos] = data;
        usedSize++;
    }

    /**
     * 查看是否包含 toFind 元素
     * @param toFind
     * @return
     */
    public boolean contains(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if (elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    /**
     * 查看 data 的下标
     * @param data
     * @return 下标
     */
    public int indexOf(int data) {
        for (int i = 0; i < usedSize; i++) {
            if (elem[i] == data) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 获取下标为 pos 的元素
     * @param pos
     * @return
     */
    public int get(int pos) {

        if (checkPos(pos)) {
            return elem[pos];
        }
        return 0;
    }

    /**
     * 设置下标为 pos 的值为 data
     * @param pos
     * @param data
     */
    public void set(int pos, int data) {
        checkPos(pos);
        elem[pos] = data;
    }

    /**
     * 获得表长度
     * @return
     */
    public int size() {
        return usedSize;
    }
    /**
     * 删除第一次出现的关键字 key
     * @param toRemove
     * @return
     */
    public boolean remove(int toRemove) {
        int index = indexOf(toRemove);
        if (-1 == index) {
            return false;
        }
        for (int i = index; i < usedSize - 1; i++) {
            elem[i] = elem[i+1];
        }
        usedSize--;
        return true;
    }

    /**
     * 清空表
     * @return
     */
    public boolean clear() {
        usedSize = 0;
        return true;
    }

}
